﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace Regexs
{
    /// <summary>
    /// 正则表达式
    /// </summary>
    public sealed class RegexClass
    {
        #region 日期和时间 

        /// <summary>
        /// 是否为日期型字符串(yyyy-MM-dd，月份和日可单可双，'-'可以用'_'或者'/'或者'.'代替)(是：true；否：false)
        /// </summary>
        /// <param name="strDate">日期字符串(YYYY-MM-DD 或者，YYYY/MM/DD，YYYY_MM_DD，YYYY.MM.DD)</param>
        /// <returns>bool</returns>
        public static bool IsDate(string strDate)
        {
            return Regex.IsMatch(strDate, @"((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))");
        }

        /// <summary>
        /// 是否为日期型字符串(yyyy-MM-dd)
        /// </summary>
        /// <param name="strDate">日期字符串(yyyy-MM-dd)</param>
        /// <returns>bool</returns>
        public static bool IsDateTwo(string strDate)
        {
            return Regex.IsMatch(strDate, @"(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)");
        }

        /// <summary>
        /// 是否为日期型字符串(dd/MM/yyyy)
        /// </summary>
        /// <param name="strDate">日期字符串(dd/MM/yyyy)</param>
        /// <returns>bool</returns>
        public static bool IsDataThree(string strDate)
        {
            return Regex.IsMatch(strDate, @"(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))");
        }

        /// <summary>
        /// 是否为时间型字符串(15:00:00)(是：true；否：false)
        /// </summary>
        /// <param name="strTime">时间字符串(15:00:00)</param>
        /// <returns>bool</returns>
        public static bool IsTime(string strTime)
        {
            return Regex.IsMatch(strTime, @"^((20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d)$");
        }

        /// <summary>
        /// 是否为(日期 + 时间)型字符串(yyyy-MM-dd，月份和日可单可双，'-'可以用'_'或者'/'或者'.'代替)(是：true；否：false)
        /// </summary>
        /// <param name="strDateTime">(日期 + 时间)型字符串</param>
        /// <returns>bool</returns>
        public static bool IsDateTime(string strDateTime)
        {
            return Regex.IsMatch(strDateTime, @"^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))" + @"(\s(((0?[0-9])|([1-2][0-3]))\:([0-5]?[0-9])((\s)|(\:([0-5]?[0-9])))))?$");
        }

        /// <summary>
        /// 是否为(日期 + 时间)型字符串(2008-05-08 15:00:00)(是：true；否：false)
        /// </summary>
        /// <param name="strDateTime">(日期 + 时间)型字符串(2008-05-08 15:00:00)</param>
        /// <returns></returns>
        public static bool IsDateTimeTwo(string strDateTime)
        {
            return Regex.IsMatch(strDateTime, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$");
        }

        #endregion

        #region 本地文件路径



        #endregion

        #region 其他

        /// <summary>
        /// 验证电子邮件(true:符合；false:不符合)
        /// </summary>
        /// <param name="strEmail">电子邮件</param>
        /// <returns>bool</returns>
        public static bool IsEmail(string strEmail)
        { 
            return Regex.IsMatch(strEmail, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
        }

        /// <summary>
        /// 验证URL
        /// </summary>
        /// <param name="strUrl">URL</param>
        /// <returns>bool</returns>
        public static bool IsUrl(string strUrl)
        {
            return Regex.IsMatch(strUrl, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
        }

        /// <summary>
        /// 验证中华人民共和国电话号码(true:符合；false:不符合)
        /// </summary>
        /// <param name="strNumber">电话号码</param>
        /// <returns>bool</returns>
        public static bool IsChinaTelephoneNo(string strNumber)
        {
            return Regex.IsMatch(strNumber, @"(\(\d{3}\)|\d{3}-)?\d{8}");
        }

        /// <summary>
        /// 验证固定电话(区号+座机号码+分机号码)
        /// </summary>
        /// <param name="strNumber"></param>
        /// <returns></returns>
        public static bool IsFixedTelephoneNo(string strNumber)
        {
            return Regex.IsMatch(strNumber, @"^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$");
        }

        /// <summary>
        /// 验证手机号码(所有手机号码，新添158和159)
        /// </summary>
        /// <param name="strNumber">号码</param>
        /// <returns>bool</returns>
        public static bool IsMobilePhone(string strNumber)
        {
            return Regex.IsMatch(strNumber, @"^((\(\d{3}\))|(\d{3}\-))?13[0-9]\d{8}|15[89]\d{8}");
        }

        /// <summary>
        /// 验证手机号码(中国移动手机号码)
        /// </summary>
        /// <param name="strNumber">号码</param>
        /// <returns>bool</returns>
        public static bool IsChinaMobilePhone(string strNumber)
        {
            return Regex.IsMatch(strNumber, @"^((\(\d{3}\))|(\d{3}\-))?13[456789]\d{8}|15[89]\d{8}");
        }

        /// <summary>
        /// 验证中华人民共和国身份证号码(true:符合；false:不符合)
        /// </summary>
        /// <param name="strNumber">身份证号码</param>
        /// <returns>bool</returns>
        public static bool IsChinaIdentity(string strNumber)
        {
            return Regex.IsMatch(strNumber, @"\d{17}[\d|X]|\d{15}");
        }

        /// <summary>
        /// 验证中华人民共和国邮政编码(true:符合；false:不符合)
        /// </summary>
        /// <param name="strNumber">邮政编码</param>
        /// <returns>bool</returns>
        public static bool IsChinaPostalcode(string strNumber)
        {
            return Regex.IsMatch(strNumber, @"\d{6}");
        }

        /// <summary>
        /// 验证汉字
        /// </summary>
        /// <param name="strChinese">汉字</param>
        /// <returns>bool</returns>
        public static bool IsChinese(string strChinese)
        {
            return Regex.IsMatch(strChinese, @"^[\u4e00-\u9fa5],{0,}$");
        }

        #endregion
    }
}
